
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gruppenkalenderProjekt.kalenderinterface;

import gruppenkalenderProjekt.data.Benutzer;
import gruppenkalenderProjekt.data.Kalender;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.MutableComboBoxModel;
import layout.TableLayout;

/**
 *
 * @author Gruppe 2
 */
class Kalenderanlage implements ActionListener {

    // Interfaceclient starten bzw. Verbindung zur Verwaltung herstellen
    private InterfaceClient ic;
    private Vector<Kalender> alleKalender;
    private Kalender aktuellerKalender = null;
    // Strings initiieren
    private static String frameString = "Gruppenkalender";
    private static String kalendernameString = "Kalendername";
    private static String kalenderauswahlString = "Kalenderauswahl";
    private static String speichernButtonString = "Speichern";
    private static String abbrechenButtonString = "Schließen";
    private static String neuButtonString = "Neu";
    private static String loeschenButtonString = "Löschen";
    //Labels, Textfelder und Buttons initiieren
    final JLabel kalendername = new JLabel(kalendernameString);
    final JLabel kalenderauswahlTextField = new JLabel(kalenderauswahlString);
    final JButton speichernButton = new JButton(speichernButtonString);
    final JButton abbrechenButton = new JButton(abbrechenButtonString);
    final JButton neuButton = new JButton(neuButtonString);
    final JButton loeschenButton = new JButton(loeschenButtonString);
    final JTextField kalendernameTextField = new JTextField();
    final JComboBox kalenderComboBox = new JComboBox();
    private JCheckBox[] checkBoxContainer = new JCheckBox[14];                  // CheckBox-Array zum Sammeln der Kalendernutzernamen. Auf 14 gefixt, da sonst der Platz im Teilnehmerfeld scrollbar gemacht werden müsste -> Wäre unschön. Ich denke 14 Teilnehmer reichen vollkommen erstmal aus.
    JFrame frame = new JFrame(frameString);
    private Benutzer aktuellerBenutzer;

    public JPanel generateComponents(GruppenkalenderInterface gki) throws RemoteException {
        ic = gki.getIC();
        alleKalender = ic.getAlleKalender();
        aktuellerBenutzer = gki.getAktuellerBenutzer();
        // Layout und Container initiieren
        Container contentPane = frame.getContentPane();
        BorderLayout layout = new BorderLayout();
        contentPane.setLayout(layout);

        // Panels
        JPanel big = new JPanel(new BorderLayout());
        big.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Kalender bearbeiten"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));

        // Top Panel
        JPanel top = new JPanel(new BorderLayout());

        // Dropdown und Kalendername
        double sizeDropdownKalendername[][] = {{175, 10, 200}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {30, 10, 30}};                                       // Rows                 Höhe jeder Zeile (35=Buttongröße, 15=Leerzeile)
        JPanel panelForDropdownKalendername = new JPanel(new TableLayout(sizeDropdownKalendername));

        panelForDropdownKalendername.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Kalender auswählen / neu anlegen"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));

        // Teilnehmer
        double sizeTeilnehmer[][] = {{121, 10, 121}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
           
            {25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25}};           // Rows                 Höhe jeder Zeile (35=Buttongröße, 15=Leerzeile)

        JPanel panelForTeilnehmer = new JPanel(new TableLayout(sizeTeilnehmer));

        panelForTeilnehmer.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Teilnehmer des Kalenders festlegen"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));

        //Liest alle Benutzer aus, die den Kalender sehen!
        Vector<Benutzer> alleBenutzer = ic.getAlleBenutzer();
        for (int i = 0; i < alleBenutzer.size(); i++) {
            String Benutzername = alleBenutzer.elementAt(i).getBenutzername();
            final JCheckBox check = new JCheckBox(Benutzername);
            if (i % 2 == 0) {
                panelForTeilnehmer.add(check, "0," + i);
                checkBoxContainer[i] = check;
            } else {
                panelForTeilnehmer.add(check, "2," + (i - 1));
                checkBoxContainer[i] = check;
            }
        }


        // Buttons
        double sizeButtons[][] = {{310, 100, 10, 100, 10, 100, 10, 100}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {130, 25}};           // Rows                 Höhe jeder Zeile (35=Buttongröße, 15=Leerzeile)

        JPanel bottom = new JPanel(new TableLayout(sizeButtons));


        //OnButtonClick
        kalenderComboBox.addActionListener(this);
        kalenderComboBox.setActionCommand("LeseAus");
        //OnButtonClick
        neuButton.addActionListener(this);
        neuButton.setActionCommand("Neu");
        //OnButtonClick
        speichernButton.addActionListener(this);
        speichernButton.setActionCommand("Speichern");
        //OnButtonClick
        loeschenButton.addActionListener(this);
        loeschenButton.setActionCommand("Löschen");
        //OnButtonClick
        abbrechenButton.addActionListener(gki);
        abbrechenButton.setActionCommand("Abbrechen");



        panelForDropdownKalendername.add(kalenderauswahlTextField, "0,0");
        panelForDropdownKalendername.add(kalenderComboBox, "2,0");
        panelForDropdownKalendername.add(kalendername, "0,2");
        panelForDropdownKalendername.add(kalendernameTextField, "2,2");


        top.add(panelForDropdownKalendername, BorderLayout.NORTH);
        top.add(panelForTeilnehmer, BorderLayout.LINE_START);
        bottom.add(neuButton, "1,1");
        bottom.add(speichernButton, "3,1");
        bottom.add(loeschenButton, "5,1");
        bottom.add(abbrechenButton, "7,1");


        big.add(top, BorderLayout.NORTH);
        big.add(bottom, BorderLayout.PAGE_END);

        this.setDropdownMenu();


        contentPane.add(big, BorderLayout.NORTH);
        return (JPanel) contentPane;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("LeseAus")) {

            try {
                this.setzeTeilnehmerUndKalendername();
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        if (e.getActionCommand().equals("Neu")) {
            try {
                this.leereAlleFelder();
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Speichern")) {

            try {
                if (aktuellerKalender != null) {
                    this.speichereAktuellenKalender();

                } else {
                    this.neuenKalenderAnlegen();
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Löschen")) {
            try {
                if (aktuellerKalender != null) {
                    this.kalenderLoeschen();

                } else {
                    String message = (String) (("Bitte wählen Sie einen Kalender aus"));
                    JOptionPane.showMessageDialog(null, message, "Löschen nicht erfolgreich", 2, null);
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void setDropdownMenu() {
        if (kalenderComboBox.getItemCount() != 0) {
            kalenderComboBox.removeAllItems();
        }

        alleKalender = ic.getAlleKalender();

        kalenderComboBox.addItem("Kalender auswählen");
        for (int i = 0; i < alleKalender.size(); i++) {
            try {
                kalenderComboBox.addItem(alleKalender.elementAt(i).getName());
            } catch (RemoteException ex) {
                Logger.getLogger(Kalenderanlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        kalenderComboBox.addActionListener(this);

    }

    public void setzeTeilnehmerUndKalendername() throws RemoteException {
        String tempKalendername = kalenderComboBox.getSelectedItem().toString();
        for (int i = 0; i < alleKalender.size(); i++) {
            if (alleKalender.elementAt(i).getName().equals(tempKalendername)) {
                kalendernameTextField.setText(tempKalendername);
                aktuellerKalender = alleKalender.elementAt(i);

                Vector<Benutzer> benutzerDesKalenders = aktuellerKalender.getBenutzer();

                for (int j = 0; j < checkBoxContainer.length; j++) {
                    if (checkBoxContainer[j] != null) {
                        checkBoxContainer[j].setSelected(false);
                        for (int k = 0; k < benutzerDesKalenders.size(); k++) {
                            if (checkBoxContainer[j].getText().equals(benutzerDesKalenders.elementAt(k).getBenutzername())) {
                                checkBoxContainer[j].setSelected(true);
                            }
                        }
                    }
                }
            }
        }
    }

    public void speichereAktuellenKalender() throws RemoteException {


        //abfrage ob die Kalender bereits existiert
        for (Kalender k : alleKalender) {
            if (k.getName().toLowerCase().equals(kalendernameTextField.getText().toLowerCase())) {
                if (!aktuellerKalender.getName().toLowerCase().equals(kalendernameTextField.getText().toLowerCase())) {
                    String message = (String) ("Der Kalender: " + kalendernameTextField.getText() + " existiert bereits, geben sie einen anderen Kalender-Namen an.");
                    JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
                    return;
                }

            }
        }

        aktuellerKalender.setName(kalendernameTextField.getText());
        aktuellerKalender.setBesitzer(aktuellerKalender.getBesitzer());
        aktuellerKalender.setKalenderID(aktuellerKalender.getKalenderID());
        aktuellerKalender.setKalendereintraege(aktuellerKalender.getKalendereintraege());

        Vector<Benutzer> temp = new Vector<Benutzer>();
        for (int i = 0; i < checkBoxContainer.length; i++) {
            if (checkBoxContainer[i] != null) {
                if (checkBoxContainer[i].isSelected()) {
                    temp.addElement(ic.getBenutzerMitBenutzername(
                            checkBoxContainer[i].getText()));
                }
            }
        }
        aktuellerKalender.setBenutzer(temp);

                //speichert den aktuellen Index
        int index = kalenderComboBox.getSelectedIndex();

        ic.updateKalender(aktuellerKalender);

        //geanderten Benutzer auch im Vector aktualisieren
        for (int i = 0; i < alleKalender.size(); i++) {
            if (aktuellerKalender.getKalenderID() == alleKalender.elementAt(i).getKalenderID()) {
                alleKalender.setElementAt(aktuellerKalender, i);
            }
        }


        //Diese 3 Zeilen fügen das geänderte Objekt hinzu und löschen das Alte
        MutableComboBoxModel mcb = (MutableComboBoxModel) kalenderComboBox.getModel();
        mcb.insertElementAt(aktuellerKalender.getName(), index);
        mcb.removeElementAt(index + 1);


    }

    public void neuenKalenderAnlegen() throws RemoteException {

        //abfrage ob die Kalender bereits existiert
        for (Kalender k : alleKalender) {
            if (k.getName().toLowerCase().equals(kalendernameTextField.getText().toLowerCase())) {
                String message = (String) ("Der Kalender: " + kalendernameTextField.getText() + " existiert bereits, geben sie einen anderen Kalender-Namen an.");
                JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
                return;
            }
        }

        Vector<Benutzer> temp = new Vector<Benutzer>();
        for (int i = 0; i < checkBoxContainer.length; i++) {
            if (checkBoxContainer[i] != null) {
                if (checkBoxContainer[i].isSelected()) {
                    temp.addElement(ic.getBenutzerMitBenutzername(
                            checkBoxContainer[i].getText()));
                }
            }
        }
        Kalender tempKalender = ic.createKalender(kalendernameTextField.getText(), null, temp, aktuellerBenutzer);
        alleKalender.addElement(tempKalender);
        kalenderComboBox.addItem(tempKalender.getName());
        int tempIndex = 0;
        for (int i = 0; i < kalenderComboBox.getItemCount(); i++) {
            tempIndex = i;
        }
        aktuellerKalender = alleKalender.lastElement();
        kalenderComboBox.setSelectedItem(kalenderComboBox.getItemAt(tempIndex));


    }

    public void kalenderLoeschen() throws RemoteException {
        
        int index = kalenderComboBox.getSelectedIndex();

        for (int j = 0; j < checkBoxContainer.length; j++) {
            if (checkBoxContainer[j] != null) {
                checkBoxContainer[j].setSelected(false);
            }
        }

        ic.deleteKalender(aktuellerKalender);
        MutableComboBoxModel mcb = (MutableComboBoxModel) kalenderComboBox.getModel();
        mcb.removeElementAt(index);

        aktuellerKalender = null;
        kalendernameTextField.setText("");
        kalenderComboBox.setSelectedIndex(0);

    }

    public void leereAlleFelder() throws RemoteException {
        kalendernameTextField.setText("");
        kalenderComboBox.setSelectedItem(kalenderComboBox.getItemAt(0));
        aktuellerKalender = null;
        for (int j = 0; j < checkBoxContainer.length; j++) {
            if (checkBoxContainer[j] != null) {
                checkBoxContainer[j].setSelected(false);
            }
        }
    }
}
